import link from './components/link'
import view from './components/view'

// 全局变量 Vue
export let _Vue = null
// 把vue-router注入到vue实例与组件中
export default function install (Vue) {
  _Vue = Vue
  // 使用混入mixin注入新的内容
  Vue.mixin({
    // 在Vue实例/组件创建前挂载内容
    beforeCreate () {
      // 此处this为Vue实例
      if (this.$options.router) {
        // 此处是 new Vue() 即 Vue实例创建
        this._router = this.$options.router
        // 记录Vue的根实例
        this._routerRoot = this
        // 调用router中的init方法初始化组件、监听地址栏等
        this._router.init(this)
        // 定义一个响应式的属性，在transitionTo 中如果current 变化之后
        // 需要给 _route 重新赋值，响应式数据变化，视图要重新渲染
        Vue.util.defineReactive(this, '_route', this._router.history.current)
      } else {
        // 初始化组件 即 Vue子类
        // 通过$parent获取Vue根实例
        this._routerRoot = this.$parent && this.$parent._routerRoot
      }
    }
  })

  // 给Vue原型上挂载 $router => 路由对象  承载方法
  // _router 为 VueRouter对象
  Object.defineProperty(Vue.prototype, '$router', {
    get () { return this._routerRoot._router }
  })

  // 给Vue原型上挂载 $route => 路由信息/路由规则   承载数据
  // _route 为 响应式数据
  Object.defineProperty(Vue.prototype, '$route', {
    get () { return this._routerRoot._route }
  })

  // 注册 router-link router-view组件
  Vue.component(link.name, link)
  Vue.component(view.name, view)
}
